package service

import (
	"ferry/models/points"
	"ferry/models/process"
	"fmt"

	"github.com/jinzhu/gorm"
)

/*
  @Author : lanyulei
  @Desc : 积分相关服务
*/

// AddUserPoints 添加用户积分
func AddUserPoints(tx *gorm.DB, userId int, processId int, workOrderId int, pointsAmount int, reason string, processName string) (err error) {
	// 查询或创建用户积分记录
	var userPoints points.UserPoints
	err = tx.Where("user_id = ?", userId).First(&userPoints).Error
	if err != nil {
		// 如果用户没有积分记录，创建新记录
		userPoints = points.UserPoints{
			UserId:      userId,
			TotalPoints: pointsAmount,
		}
		if err := tx.Create(&userPoints).Error; err != nil {
			return fmt.Errorf("创建用户积分记录失败: %v", err)
		}
	} else {
		// 更新积分
		userPoints.TotalPoints += pointsAmount
		if err := tx.Save(&userPoints).Error; err != nil {
			return fmt.Errorf("更新用户积分失败: %v", err)
		}
	}

	// 创建积分历史记录
	pointsHistory := points.PointsHistory{
		UserId:      userId,
		ProcessId:   processId,
		WorkOrderId: workOrderId,
		Points:      pointsAmount,
		Type:        1, // 获取积分
		Reason:      reason,
		ProcessName: processName,
	}
	if err := tx.Create(&pointsHistory).Error; err != nil {
		return fmt.Errorf("创建积分历史记录失败: %v", err)
	}

	return nil
}

// DeductUserPoints 扣减用户积分
func DeductUserPoints(tx *gorm.DB, userId int, pointsAmount int, reason string) (err error) {
	// 查询用户积分记录
	var userPoints points.UserPoints
	err = tx.Where("user_id = ?", userId).First(&userPoints).Error
	if err != nil {
		return fmt.Errorf("查询用户积分记录失败: %v", err)
	}

	// 检查积分是否足够
	if userPoints.TotalPoints < pointsAmount {
		return fmt.Errorf("用户积分不足")
	}

	// 扣减积分
	userPoints.TotalPoints -= pointsAmount
	if err := tx.Save(&userPoints).Error; err != nil {
		return fmt.Errorf("扣减用户积分失败: %v", err)
	}

	// 创建积分历史记录（负数表示扣减）
	pointsHistory := points.PointsHistory{
		UserId: userId,
		Points: -pointsAmount,
		Type:   2, // 兑换商品消耗积分
		Reason: reason,
	}
	if err := tx.Create(&pointsHistory).Error; err != nil {
		return fmt.Errorf("创建积分历史记录失败: %v", err)
	}

	return nil
}

// 检查流程是否开启积分奖励并处理积分
func HandleProcessPoints(tx *gorm.DB, processId int, workOrderId int, userId int) (err error) {
	var processInfo process.Info

	// 查询流程信息
	err = tx.Where("id = ?", processId).First(&processInfo).Error
	if err != nil {
		return fmt.Errorf("查询流程信息失败: %v", err)
	}

	// 积分奖励逻辑已移除，不再基于流程配置自动奖励积分

	return nil
}
